Hibernate Filters হল Hibernate ORM-এ একটি গুরুত্বপূর্ণ বৈশিষ্ট্য, যা আপনাকে dynamic queries বা condition-based filtering করতে সাহায্য করে। Hibernate Filters আপনাকে ডেটাবেস থেকে নির্দিষ্ট কন্ডিশন অনুসারে ডেটা নির্বাচন করতে সুবিধা দেয়, যা SQL WHERE ক্লজের মতো কাজ করে, কিন্তু এটি কোডের মধ্যে প্রয়োগ করা হয়।
Hibernate Filters মূলত @Filter এবং @FilterDef অ্যানোটেশন ব্যবহার করে তৈরি করা হয় এবং এগুলি ডাইনামিক কন্ডিশনাল ফিল্টার প্রয়োগ করতে ব্যবহৃত হয়। এতে ডেটা লোড করার সময় আপনি কোনো নির্দিষ্ট শর্ত (যেমন, is_active বা is_deleted ফিল্ডের মান) প্রয়োগ করতে পারেন।
Hibernate Filter: কিভাবে কাজ করে?
- @FilterDef: ফিল্টারের কন্ডিশন ডিফাইন করার জন্য ব্যবহৃত হয়।
- @Filter: সেই ফিল্টারটি একটি নির্দিষ্ট এনটিটি ক্লাসে প্রয়োগ করার জন্য ব্যবহৃত হয়।
- @ParamDef: কন্ডিশনের জন্য প্যারামিটার ডিফাইন করার জন্য ব্যবহৃত হয়।
Real-World Example: Using Hibernate Filters
ধরা যাক, আমাদের একটি Employee টেবিল রয়েছে এবং আমরা চাই যে কিছু filtering criteria দিয়ে শুধুমাত্র সক্রিয় (active) কর্মচারীদের রিট্রিভ করতে পারি।
Step 1: Define Entity and Filter
প্রথমে আমরা Employee ক্লাস তৈরি করব এবং ফিল্টার প্রয়োগ করার জন্য @FilterDef এবং @Filter অ্যানোটেশন ব্যবহার করব।
Employee Entity with Filter
import javax.persistence.Entity;
import javax.persistence.Id;
import org.hibernate.annotations.Filter;
import org.hibernate.annotations.FilterDef;
import org.hibernate.annotations.ParamDef;
@Entity
@FilterDef(name = "activeEmployeeFilter",
parameters = @ParamDef(name = "isActive", type = "boolean"))
@Filter(name = "activeEmployeeFilter", condition = "is_active = :isActive")
public class Employee {
@Id
private int id;
private String name;
private boolean isActive; // True if active, false if inactive
// Getters and Setters
}
Explanation:
@FilterDef: এখানেactiveEmployeeFilterনামে একটি ফিল্টার ডিফাইন করা হয়েছে, যেখানেisActiveনামক প্যারামিটার রয়েছে, যেটিbooleanটাইপ।@Filter: এটিis_activeফিল্ডের মানের উপর ভিত্তি করে ফিল্টার প্রয়োগ করে, যেখানে:isActiveহল প্যারামিটার যার মাধ্যমেis_activeফিল্ডের মান চেক করা হয়।
Step 2: Apply the Filter in a Session
এখন, আমরা Hibernate সেশনে ফিল্টার প্রয়োগ করব। আমরা ফিল্টারটি সক্রিয় (active) কর্মচারীদের জন্য ব্যবহার করব, যাতে কেবলমাত্র সক্রিয় কর্মচারীরা রিট্রিভ হয়।
Hibernate Session Code
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.hibernate.query.Query;
import java.util.List;
public class EmployeeService {
public static void main(String[] args) {
// Step 1: Create SessionFactory and Session
SessionFactory factory = new Configuration().configure("hibernate.cfg.xml")
.addAnnotatedClass(Employee.class)
.buildSessionFactory();
Session session = factory.getCurrentSession();
try {
// Step 2: Open a session and start a transaction
session.beginTransaction();
// Step 3: Enable the filter and set parameters (fetching only active employees)
session.enableFilter("activeEmployeeFilter").setParameter("isActive", true);
// Step 4: Query the employees
Query<Employee> query = session.createQuery("from Employee", Employee.class);
// Step 5: Get the result list
List<Employee> activeEmployees = query.getResultList();
// Step 6: Display the result
for (Employee emp : activeEmployees) {
System.out.println("Employee Name: " + emp.getName() + ", Active: " + emp.isActive());
}
// Step 7: Commit the transaction
session.getTransaction().commit();
} finally {
factory.close();
}
}
}
Explanation:
session.enableFilter("activeEmployeeFilter").setParameter("isActive", true): এখানেactiveEmployeeFilterফিল্টারটি চালু করা হচ্ছে এবংisActiveপ্যারামিটারটিtrueসেট করা হচ্ছে। এটি কেবলমাত্র সক্রিয় (active) কর্মচারীদের রিট্রিভ করবে।session.createQuery("from Employee", Employee.class): এটিEmployeeটেবিল থেকে সকল কর্মচারীকে রিট্রিভ করার জন্য HQL কুয়েরি তৈরি করে। তবে, ফিল্টারটি ব্যবহারের কারণে কেবলমাত্র সক্রিয় কর্মচারীদেরই রিট্রিভ করা হবে।
Step 3: Test and Validate
উপরের কোড চালানোর পর, যদি ডাটাবেসে Employee টেবিলের মধ্যে কিছু ইনঅ্যাকটিভ (inactive) কর্মচারী থাকে, তবে তারা রিটার্ন হবে না, কারণ আমরা কেবল active কর্মচারীদেরই ফিল্টার করেছি।
Hibernate Filter Features
- Dynamic: Hibernate ফিল্টার ডাইনামিক্যালি কার্যকরী করা যায়, যা কোডের মধ্যে চলাকালীন সময়ে সেট করা যেতে পারে।
- Reusable: একবার একটি ফিল্টার ডিফাইন করা হলে, সেটি অ্যাপ্লিকেশনের বিভিন্ন জায়গায় পুনরায় ব্যবহার করা যেতে পারে।
- Performance: ফিল্টার ব্যবহারের মাধ্যমে কোডে performance optimization করা যায়, কারণ ফিল্টার কার্যকরী হওয়ার মাধ্যমে ডেটাবেসের unnecessary data retrieval কমানো হয়।
4. Other Filter Examples
Example 1: Filter Inactive Employees
@Filter(name = "inactiveEmployeeFilter", condition = "is_active = :isActive")
public class Employee {
@Id
private int id;
private String name;
private boolean isActive;
// Getters and Setters
}
Enable and Set Filter for Inactive Employees:
session.enableFilter("inactiveEmployeeFilter").setParameter("isActive", false);
Hibernate Filters হল একটি শক্তিশালী ফিচার যা ডেটাবেস থেকে ডেটা ফিল্টার করার জন্য খুবই কার্যকরী। @Filter এবং @FilterDef অ্যানোটেশন ব্যবহার করে আপনি সুনির্দিষ্ট কন্ডিশন অনুসারে ডেটা রিট্রিভ করতে পারেন। ফিল্টার ব্যবহার করে আপনি ডেটা রিট্রিভাল প্রক্রিয়াকে আরও ডাইনামিক এবং পারফরম্যান্স অপটিমাইজড করতে পারেন।
Hibernate Filters ব্যবহার করার মাধ্যমে আপনি আরও নির্দিষ্ট এবং কাস্টমাইজড ডেটা ফিল্টার করতে পারবেন এবং আপনার অ্যাপ্লিকেশনটি আরও কার্যকরী এবং দ্রুতগতিতে চালাতে পারবেন।
Read more